using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;


namespace Gratamira.AccesoDato
{
    

    public class Conexion
    {
        public static string pathXML;
        public static string sistema = "";

        public static string obtenerCadenaConexion(string pSistema) 
        {
            string miCadena="";
            try
            {
                XmlDocument miDoc = new XmlDocument();
                miDoc.LoadXml(desencriptarXML());
                XmlNode nodoBD;
                nodoBD = miDoc.SelectSingleNode("Sistemas/Sistema[@Nombre='" + pSistema + "']");
                foreach (XmlNode nodoXml in nodoBD.ChildNodes)
                {
                    if (nodoXml.InnerText != "")
                    {
                        miCadena = String.Concat(miCadena, nodoXml.InnerText, "; ");
                    }
                }
                return miCadena.Substring(0, miCadena.Length - 2);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        private static string desencriptarXML()
        {
            try
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString("<RSAKeyValue><Modulus>1awNLNRPqpt6ahq6Ws5EKbYP3ipE01e3z5ynC8XVuRKfX8SEXqYmjVFRBAEYugpreeByO9Ljltq9eTYiiEwwwu5iAyOH4wvpCPUAc2iJ8P4g4c97qOQfAuHyu+9tVut/Lvc5Bg7hqKRyDN5G8ApEG7jgq+eswsG+YS+IvPh3AVM=</Modulus><Exponent>AQAB</Exponent><P>614MUlK8BNboHfocJPWm2N6y5BLeKTKXNQCvFO4WXNu1sREUFPlhNa9PJ0QDuqhmo/2atBPoi5Edm3l/2Hmdfw==</P><Q>6Gch5r1j7IstW/2Xb00moYyZa6kQUyldY4Fv1gEnjZ49GGmpD8wQ8aZBLjW7oFPMZ2C0/E0n1zubbOPFFvauLQ==</Q><DP>Txij+2ZiWR3/k1Nh8em70FXGuG6+ygl+VwmLzPTV/w622HJs1T+ZM3lemEt7FVdSZvnq62llVMHHuV/zXsQ/8Q==</DP><DQ>mAa3B5DGp/sXTgDiqh1m8vDdf67VjgEWJTyL4wtYS2zC/JBJ1pqgTuN56feeaC/JG6sIWa9DK6nDb4TD7dSqdQ==</DQ><InverseQ>CfXEJdslwbo+a2cK9TdADQjF8z+e5ud357j8sCY5qfFeT74DgUkJHBo0n4lh4FDNkhLBuRmqcl4FC30zB2aioA==</InverseQ><D>AiKxEwSgMzVQmOThfezX047lQ7Qqce5LgQCwzrZQd4QPIbbmF8gTVJA+fgrAw4M9Jb+vhJeL/ML858w5tiEEz7lDXgFl5wZJ2P8ezEQD3f///ZmEQgmtcmQbgwY7eGaBNePDJhlo5MaFVV1Mp7LoxhON3PwUfpjiU2rozU9RyNk=</D></RSAKeyValue>");

                FileStream fs = new FileStream(pathXML, FileMode.Open, FileAccess.Read);
                StreamReader sr = new StreamReader(fs);
                //Carga el documento xml encriptado
                XmlDocument xmlEncDoc = new XmlDocument();
                xmlEncDoc.LoadXml(sr.ReadToEnd());

                //Crear el documento xml y especificar la misma llave, y el nombre llave, que fueron usados para encriptarlo.
                // la llave privada rsa es usada aqui para desencriptar los datos.
                EncryptedXml encXml = new EncryptedXml(xmlEncDoc);
                encXml.AddKeyNameMapping("asyncKey", rsa);

                //Desencriptar el documento elementos <EncriptedData> que contiene la misma llave.
                encXml.DecryptDocument();
                sr.Close();
                fs.Close();

                //el documento xml ha sido modificado y ahora contiene el xml desencriptado.
                return xmlEncDoc.OuterXml;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        public static string[] obtenerLista()
        {
            //Buscar en el archivo XML el nodo del sistema
            try
            {
                //******** Clase XmlDocument  ***************
                XmlDocument miDoc = new XmlDocument();
                miDoc.LoadXml(desencriptarXML());
                //******** Clase XmlNodeList ***************
                XmlNodeList misNodos;
                misNodos = miDoc.GetElementsByTagName("Sistema");

                string[] miLista = new string[misNodos.Count];
                for (int i = 0; i < misNodos.Count; i++)
                {
                    miLista[i] = misNodos[i].Attributes.GetNamedItem("Nombre").Value;
                }
                return miLista;
            }
            catch (ApplicationException ex)
            {
                throw ex;
            }
        }
    }
}
